/*-
 * Copyright (c) 2009 Jonathan Anderson
 * All rights reserved.
 *
 * WARNING: THIS IS EXPERIMENTAL SECURITY SOFTWARE THAT MUST NOT BE RELIED
 * ON IN PRODUCTION SYSTEMS.  IT WILL BREAK YOUR SOFTWARE IN NEW AND
 * UNEXPECTED WAYS.
 * 
 * This software was developed at the University of Cambridge Computer
 * Laboratory with support from a grant from Google, Inc. 
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <sys/capability.h>
#include <libuserangel.h>

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>

#include <QtGui>
#include "TextEditor.h"



TextEditor::TextEditor()
	: QMainWindow()
{
	ui.setupUi(this);
	connect(ui.actionOpen,     SIGNAL(activated()), this, SLOT(open()));
	connect(ui.actionSave,     SIGNAL(activated()), this, SLOT(save()));
	connect(ui.actionSaveAs,   SIGNAL(activated()), this, SLOT(saveAs()));
	connect(ui.actionClose,    SIGNAL(activated()), this, SLOT(close()));
	connect(ui.actionQuit,     SIGNAL(activated()), this, SLOT(quit()));

	show();
}


TextEditor::~TextEditor()
{
	close();
}


void TextEditor::open()
{
	QString filename = QFileDialog::getOpenFileName(this);
	if(filename.size() == 0)
	{
		if(errno != ECANCELED)
			QMessageBox::warning(this, tr("Error Opening File"),
				tr("Error in file dialog: ") + strerror(errno));

		return;
	}

	QFile file(filename);
	if(file.open(QFile::ReadOnly))
	{
		this->filename = filename;
		QString contents = file.readAll();
		ui.text->setPlainText(contents);
	}
	else
		QMessageBox::warning(this, tr("Error Opening File"),
		                     tr("Error opening file: ") + strerror(errno));
}


void TextEditor::save()
{
	if(filename.size() == 0)
	{
		saveAs();
		return;
	}

	QFile file(filename);
	if(file.open(QFile::ReadWrite | QFile::Truncate))
	{
		qDebug() << filename << "=>" << file.fileName();
		file.write(ui.text->toPlainText().toAscii());
		file.flush();
	}
	else
		QMessageBox::warning(this, tr("Error Saving File"),
		                     tr("Error opening file in Read-Write mode"));
}


void TextEditor::saveAs()
{
	QString filename = QFileDialog::getSaveFileName(this);
	if(filename.size() == 0)
	{
		if(errno != ECANCELED)
			QMessageBox::warning(this, tr("Error Saving File"),
				tr("Error in file dialog: ") + strerror(errno));

		return;
	}

	QFile file(filename);
	if(file.open(QFile::WriteOnly))
	{
		this->filename = filename;
		file.write(ui.text->toPlainText().toAscii());
		file.flush();
	}
	else
		QMessageBox::warning(this, tr("Error Opening File"),
		                     tr("Error opening file: ") + strerror(errno));
}


void TextEditor::close()
{
	ui.text->setPlainText("");
	filename = "";
}


void TextEditor::quit()
{
	close();
	QMainWindow::close();
}

